"""
用户模型和操作 (models/user.py)

处理用户数据的加载、保存和身份验证。
使用MySQL数据库存储。
"""
import uuid
from datetime import datetime
from models.db_models import User as DBUser
from models import db_session
from utils.auth_utils import hash_password, check_password, generate_token
import logging

logger = logging.getLogger(__name__)

def load_users():
    """
    从数据库加载所有用户数据。
    """
    # 从MySQL加载
    users = []
    db_users = db_session.query(DBUser).all()
    for db_user in db_users:
        # 排除敏感信息
        users.append({
            'id': db_user.id,
            'username': db_user.username,
            'email': db_user.email,
            'role': db_user.role,
            'created_at': db_user.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if db_user.created_at else None,
            'last_login': db_user.last_login.strftime("%Y-%m-%dT%H:%M:%SZ") if db_user.last_login else None
        })
    return users

def get_user_by_id(user_id):
    """
    根据ID获取用户。
    """
    db_user = db_session.query(DBUser).filter(DBUser.id == user_id).first()
    if db_user:
        return {
            'id': db_user.id,
            'username': db_user.username,
            'email': db_user.email,
            'role': db_user.role,
            'created_at': db_user.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if db_user.created_at else None,
            'last_login': db_user.last_login.strftime("%Y-%m-%dT%H:%M:%SZ") if db_user.last_login else None
        }
    return None

def get_user_by_username(username):
    """
    根据用户名获取用户。
    """
    db_user = db_session.query(DBUser).filter(DBUser.username == username).first()
    if db_user:
        return {
            'id': db_user.id,
            'username': db_user.username,
            'email': db_user.email,
            'role': db_user.role,
            'password_hash': db_user.password_hash,  # 包含密码哈希用于认证
            'created_at': db_user.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if db_user.created_at else None,
            'last_login': db_user.last_login.strftime("%Y-%m-%dT%H:%M:%SZ") if db_user.last_login else None
        }
    return None

def create_user(username, password, email=None, role='user'):
    """
    创建新用户。
    
    Args:
        username: 用户名
        password: 密码
        email: 电子邮箱 (可选)
        role: 角色 (默认: user)
        
    Returns:
        dict: 新创建的用户数据 (无密码信息)
        None: 如果用户名已存在
    """
    # 检查用户名是否已存在
    if get_user_by_username(username):
        return None
    
    # 生成新用户ID和创建时间
    user_id = str(uuid.uuid4())
    created_at = datetime.utcnow()
    
    # 对密码进行哈希
    password_hash = hash_password(password)
    
    # 创建MySQL用户记录
    db_user = DBUser(
        id=user_id,
        username=username,
        password_hash=password_hash,
        email=email,
        role=role,
        created_at=created_at
    )
    
    # 保存到数据库
    db_session.add(db_user)
    db_session.commit()
    
    # 返回用户数据 (不含密码)
    return {
        'id': db_user.id,
        'username': db_user.username,
        'email': db_user.email,
        'role': db_user.role,
        'created_at': db_user.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if db_user.created_at else None
    }

def update_user_last_login(user_id):
    """
    更新用户最后登录时间。
    """
    last_login = datetime.utcnow()
    
    db_user = db_session.query(DBUser).filter(DBUser.id == user_id).first()
    if db_user:
        db_user.last_login = last_login
        db_session.commit()
        return True
    return False

def authenticate_user(username, password):
    """
    验证用户身份。
    
    Args:
        username: 用户名
        password: 密码
        
    Returns:
        dict: 包含用户信息和令牌的字典
        None: 如果认证失败
    """
    # 获取用户 (包含密码哈希)
    user = get_user_by_username(username)
    if not user:
        return None
    
    # 验证密码
    if not check_password(password, user['password_hash']):
        return None
    
    # 更新最后登录时间
    update_user_last_login(user['id'])
    
    # 生成认证令牌
    token = generate_token(user['id'], user['username'], user['role'])
    
    # 返回用户信息 (不含密码) 和令牌
    result = {
        'token': token,
        'user': {
            'id': user['id'],
            'username': user['username'],
            'role': user['role']
        }
    }
    
    return result

def change_password(user_id, old_password, new_password):
    """
    修改用户密码。
    
    Args:
        user_id: 用户ID
        old_password: 旧密码
        new_password: 新密码
        
    Returns:
        bool: 修改成功返回True，否则返回False
    """
    db_user = db_session.query(DBUser).filter(DBUser.id == user_id).first()
    if not db_user:
        return False
    
    # 验证旧密码
    if not check_password(old_password, db_user.password_hash):
        return False
    
    # 设置新密码
    db_user.password_hash = hash_password(new_password)
    db_session.commit()
    return True 